/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#ifndef SinglyLinkedList_h
#define SinglyLinkedList_h

namespace WTF {

template <typename Node> class SinglyLinkedList {
public:
    SinglyLinkedList();
    
    bool isEmpty();

    void push(Node*);
    Node* pop();

private:
    Node* m_head;
};

template <typename Node> inline SinglyLinkedList<Node>::SinglyLinkedList()
    : m_head(0)
{
}

template <typename Node> inline bool SinglyLinkedList<Node>::isEmpty()
{
    return !m_head;
}

template <typename Node> inline void SinglyLinkedList<Node>::push(Node* node)
{
    ASSERT(node);
    node->setNext(m_head);
    m_head = node;
}

template <typename Node> inline Node* SinglyLinkedList<Node>::pop()
{
    Node* tmp = m_head;
    m_head = m_head->next();
    return tmp;
}

}

using WTF::SinglyLinkedList;

#endif
